package com.zpark.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zpark.dto.AppointmentQueryDTO;
import com.zpark.entity.patients.PatientAppointments;

import java.util.Date;
import java.util.List;

/**
 * 患者预约服务接口
 */
public interface PatientAppointmentsService {

    static void update(PatientAppointments existing) {
    }

    /**
     * 创建新预约
     * @param appointment 预约信息（需包含appointmentId）
     * @return 创建成功的预约记录
     */
    PatientAppointments createAppointment(PatientAppointments appointment);

    /**
     * 删除预约记录
     * @param appointmentId 预约编号
     * @return 是否删除成功
     */
    PatientAppointments deleteAppointment(String appointmentId);

    /**
     * 更新预约信息
     * @param appointment 更新后的预约信息
     * @return 更新后的预约记录
     */
    PatientAppointments updateAppointment(PatientAppointments appointment);

    /**
     * 取消预约
     * @param appointmentId 预约编号（原主键id已废弃）
     * @param cancelReason 取消原因
     * @return 是否取消成功
     */
    boolean cancelAppointment(String appointmentId, String cancelReason);

    /**
     * 确认预约
     * @param appointmentId 预约编号
     * @return 是否确认成功
     */
    boolean confirmAppointment(String appointmentId);

    /**
     * 完成预约
     * @param appointmentId 预约编号
     * @return 是否完成成功
     */
    boolean completeAppointment(String appointmentId);

    /**
     * 根据预约编号获取预约详情（主查询方法）
     * @param appointmentId 预约编号
     * @return 预约详情
     */
    PatientAppointments getAppointmentByAppointmentId(String appointmentId);

    /**
     * 获取患者的所有预约
     * @param patientId 患者ID
     * @return 预约列表
     */
    List<PatientAppointments> getAppointmentsByPatientId(Integer patientId);

    /**
     * 获取医生的所有预约
     * @param doctorId 医生ID
     * @return 预约列表
     */
    List<PatientAppointments> getAppointmentsByDoctorId(String doctorId);

    /**
     * 根据状态筛选预约
     * @param status 预约状态
     * @return 预约列表
     */
    List<PatientAppointments> getAppointmentsByStatus(String status);

    /**
     * 获取待确认的预约列表
     * @return 待确认预约列表
     */
    List<PatientAppointments> getPendingAppointments();

    /**
     * 发送预约提醒
     * @param appointmentId 预约编号
     * @return 是否发送成功
     */
    boolean sendAppointmentReminder(String appointmentId);

    /**
     * 检查预约是否冲突
     * @param doctorId 医生ID
     * @param appointmentDate 预约日期
     * @param timeSlot 时间段
     * @return 是否冲突
     */
    boolean checkAppointmentConflict(String doctorId, Date appointmentDate, String timeSlot);

    /**
     * 分页查询预约列表
     * @return 预约分页列表
     */
    IPage<PatientAppointments> listAppointmentsByPage(Page<PatientAppointments> page, AppointmentQueryDTO queryDTO);

    /**
     * 统计预约数量
     * @param status 预约状态(可选)，传null表示统计全部
     * @return 预约数量
     */
    long countAppointments(String status);

    /**
     * 获取患者最近的预约
     * @param patientId 患者ID
     * @param limit 获取数量
     * @return 最近的预约列表
     */
    List<PatientAppointments> getRecentAppointmentsByPatient(Integer patientId, int limit);

    /**
     * 获取医生最近的预约
     * @param doctorId 医生ID
     * @param limit 获取数量
     */
    List<PatientAppointments> getRecentAppointmentsByDoctor(String doctorId, int limit);

    /**
     * 获取所有预约（谨慎使用，数据量大时应分页）
     */
    List<PatientAppointments> getAllAppointments();

    // 新增方法 ---------------------------------------------------

    List<PatientAppointments> getAppointmentHistory(String appointmentId);

    /**
     * 根据条件组合查询预约
     * @param patientId 患者ID（可选）
     * @param doctorId 医生ID（可选）
     * @param status 状态（可选）
     * @param startDate 开始日期（可选）
     * @param endDate 结束日期（可选）
     */
    /**
     * 根据多条件查询预约
     * @param queryDTO 查询条件
     * @return 预约列表
     */
    List<PatientAppointments> queryAppointments(AppointmentQueryDTO queryDTO);

    boolean updateAppointmentStatus(String appointmentId, String newStatus);

    /**
     * 更新预约状态
     * @param appointmentId 预约编号
     * @param newStatus 新状态
     */



}
